www.gusucode.com > VC++ 代码实现绘制生成一个五角星-源码程序 > VC++ 代码实现绘制生成一个五角星-源码程序/code/Pentacle.cpp

    //Download by http://www.NewXing.com
// Pentacle.cpp: implementation of the CPentacle class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Five.h"
#include "Pentacle.h"
#include <math.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CPentacle::CPentacle()
{
	m_lColor = RGB(255, 0, 0);				// 初始化颜色为红色
	m_lWidth = 0;
	m_lHigh = 0;
}

CPentacle::~CPentacle()
{

}

//////////////////////////////////////////////////////////////////////
// 计算五角星的各个顶点
// DWORD lHigh			绘画区域的高
// DWORD lWidth			绘画区域的宽
// 返回是否创建点成功
//////////////////////////////////////////////////////////////////////

bool CPentacle::CalculateFivePoint(DWORD lWidth, DWORD lHigh)
{
	m_vPointList.clear();		// 清空点列表
	m_lHigh = lHigh;
	m_lWidth = lWidth;

	double dAngle = 90;			// 角度, 初始化为正上方

	for ( int i = 0; i < 5; i++) {
		CPoint point;

		point.x = lWidth/2.0 * ( 1 + cos( dAngle / 180 * PI ) );
		point.y = lHigh/2.0 * ( 1 - sin( dAngle / 180 * PI ) );

		m_vPointList.push_back(point);

		// 计算下一个点
		dAngle += 360 / 5 * 2;			// 如果不*2,那么结果是一个五边形,不是五角星
		if ( dAngle > 360 ) {
			dAngle -= 360;
		}
	}

	return true;
}

//////////////////////////////////////////////////////////////////////
// 计算其他多边形顶点位置,点顺序
// DWORD lHigh			绘画区域的高
// DWORD lWidth			绘画区域的宽
// int iNumber			创建点的数量,不可以小于3个点
// 返回是否创建点成功
//////////////////////////////////////////////////////////////////////

bool CPentacle::CalculatePoint(DWORD lWidth, DWORD lHigh, int iNumber)
{
	m_vPointList.clear();		// 清空点列表
	m_lHigh = lHigh;
	m_lWidth = lWidth;

	double dAngle = 90;			// 角度, 初始化为正上方

	for ( int i = 0; i < iNumber; i++) {
		CPoint point;

		point.x = lWidth/2.0 * ( 1 + cos( dAngle / 180 * PI ) );
		point.y = lHigh/2.0 * ( 1 - sin( dAngle / 180 * PI ) );

		m_vPointList.push_back(point);

		// 计算下一个点
		dAngle += 360 / iNumber;
		if ( dAngle > 360 ) {
			dAngle -= 360;
		}
	}

	return true;
	return true;
}

//////////////////////////////////////////////////////////////////////
// 绘制图形
// CDC* pDC				绘制图形的设备句柄
// 返回绘制是否成功
//////////////////////////////////////////////////////////////////////

bool CPentacle::Draw(CDC* pDC)
{
	// 创建点的列表
	int	lNum = m_vPointList.size();
	CPoint* pList = new CPoint[lNum];
	for ( int i = 0; i < lNum; i++ ) {
		pList[i] = m_vPointList[i];
	}

	// 创建多边形区域
	CRgn	Rgn;
	Rgn.CreatePolygonRgn(pList, lNum, WINDING);
	pDC->SelectObject(&Rgn);

	// 创建画刷
	CBrush brush;
	brush.CreateSolidBrush(m_lColor);
	CBrush*	pOldBrush = pDC->SelectObject(&brush);

	// 创建画笔
	CPen pen;
	pen.CreatePen(PS_SOLID, 1, m_lColor);
	CPen* pOldPen = pDC->SelectObject(&pen);

	pDC->Ellipse(0, 0, m_lWidth, m_lHigh);

	pen.DeleteObject();
	pDC->SelectObject(pOldPen);
	brush.DeleteObject();
	pDC->SelectObject(pOldBrush);
	Rgn.DeleteObject();
	
	if ( NULL != pList ) {
		delete [] pList;
		pList = NULL;
	}
	return true;
}